﻿#region File Header
//
// IFiniteQueue.cs - Common interface for all types of finite queues
//
// Copyright (C) Javier Valcarce. BSD License
#endregion

#region Using Statements
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
#endregion

namespace Arq
{
    /// <summary>
    /// Generic Finite Queue. There are many versions of this concept, 
    /// thread-safe with blocking API
    /// thread-safe with non-blocking API
    /// non thread-safe (and therefore non-blocking API)
    /// </summary>
    /// <typeparam name="T">Generic type</typeparam>
    interface IFiniteQueue<T>
    {
        void Clear();
        int  Enqueue(T item);
        int  Enqueue(T[] src, int offset, int count);
        int  Dequeue(out T item);
        int  Dequeue(T[] dst, int offset, int count);
        T    this[int index] { get; set; }
        int  Capacity { get; }
        int  Count { get; }
        int  Space { get; }
    }
}
